package Server.TechnicalServices.Foundation;

import java.util.ArrayList;

import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.criterion.Restrictions;

import Server.Entity.Dominio.*;

/**
 * 
 * Gestisce le dipendenze con il database delle classi relative alla gerarchia del progetto
 * 
 * @author Gruppo 6
 *
 */
public class FLavoro {

	private FHibernateFacadeSingleton hibernate = FHibernateFacadeSingleton.istanza();
	private Session session = hibernate.getSession();
	
	/**
	 * Restituisce il sottoprogetto del task
	 * @param task
	 * @return
	 */
	public ESottoprogetto getSottoprogetto(ETask task)
	{
		Criteria crit = session.createCriteria(ESottoprogetto.class).createCriteria("tasks").add( Restrictions.eq("id", task.getId() ));
		return (ESottoprogetto) crit.list().get(0);		
	}
	/**
	 * Restituisce il progetto del task
	 * @param task
	 * @return
	 */
	public EProgetto getProgetto(ETask task)
	{
		Criteria crit = session.createCriteria(EProgetto.class).createCriteria("sottoprogetti").createCriteria("tasks").add( Restrictions.eq("id", task.getId() ));
		return (EProgetto) crit.list().get(0);		
	}
	/**
	 * Restituisce il sottoprogetto del progetto
	 * @param sottoprogetto2
	 * @return
	 */
	public EProgetto getProgetto(ESottoprogetto sottoprogetto2) {
		Criteria crit = session.createCriteria(EProgetto.class).createCriteria("sottoprogetti").add( Restrictions.eq("id", sottoprogetto2.getId() ));
		return (EProgetto) crit.list().get(0);		
	}
	/**
	 * Restituisce la fattura del progetto
	 * @param progetto
	 * @return
	 */
	public EFattura getFatturaByProgetto(EProgetto progetto)
	{
		Criteria crit = session.createCriteria(EFattura.class).add( Restrictions.eq("progetto", progetto ));
		
		EFattura fattura = null;
		if (!crit.list().isEmpty())
			fattura = (EFattura) crit.list().get(0);
		return fattura;		
	}
	/**
	 *  Restituisce la lista dei task che dipendono da un task dato
	 * @param eTaskI
	 * @return
	 */
	public ArrayList<EDipendenza> getDipendenzeTaskFiglio(ETask eTaskI) {
		Criteria crit = session.createCriteria(EDipendenza.class).add( Restrictions.eq("figlio", eTaskI));
		return (ArrayList) crit.list();
	}
	/**
	 * Restituisce la lista dei task che non possono essere eseguiti prima della fine del task dato
	 * @param eTaskI
	 * @return
	 */	
	public ArrayList<EDipendenza> getDipendenzeTaskPadre(ETask eTaskI) {
		Criteria crit = session.createCriteria(EDipendenza.class).add( Restrictions.eq("padre", eTaskI));
		return (ArrayList) crit.list();
	}	
	/**
	 * Restituisce la lista delle notifiche relative al fatto che un dato task sia stato assegnato
	 * @param task
	 * @return
	 */
	public ArrayList<ENotificaTaskAssegnato> getNotificheTaskAssegnato(ETask task)
	{
		Criteria crit = session.createCriteria(ENotificaTaskAssegnato.class).add( Restrictions.eq("task", task));
		return (ArrayList) crit.list();		
	}
	/**
	 * Restituisce la lista delle notifiche relative al fatto che un dato task sia stato revocato
	 * @param task
	 * @return
	 */
	public ArrayList<ENotificaTaskRevocato> getNotificheTaskRevocato(ETask task)
	{
		Criteria crit = session.createCriteria(ENotificaTaskRevocato.class).add( Restrictions.eq("task", task));
		return (ArrayList) crit.list();		
	}
	/**
	 * Restituisce la lista delle notifiche relative al fatto che un dato task sia stato modificato
	 * @param task
	 * @return
	 */
	public ArrayList<ENotificaTaskRevocato> getNotificheTaskModificato(ETask task)
	{
		Criteria crit = session.createCriteria(ENotificaTaskModificato.class).add( Restrictions.eq("task", task));
		return (ArrayList) crit.list();		
	}
	/**
	 * Restituisce la lista delle notifiche relative al fatto che un dato sottoprogetto sia stato assegnato
	 * @param task
	 * @return
	 */
	public ArrayList<ENotificaSottoprogettoAssegnato> getNotificheSottoprogettoAssegnato(ESottoprogetto sottoprogetto) {
		Criteria crit = session.createCriteria(ENotificaSottoprogettoAssegnato.class).add( Restrictions.eq("sottoprogetto", sottoprogetto));
		return (ArrayList) crit.list();	
	}
	/**
	 * Restituisce la lista delle notifiche relative al fatto che un dato sottoprogetto sia stato revocato
	 * @param task
	 * @return
	 */
	public ArrayList<ENotificaSottoprogettoAssegnato> getNotificheSottoprogettoRevocato(ESottoprogetto sottoprogetto) {
		Criteria crit = session.createCriteria(ENotificaSottoprogettoRevocato.class).add( Restrictions.eq("sottoprogetto", sottoprogetto));
		return (ArrayList) crit.list();	
	}
	/**
	 * Restituisce la lista delle notifiche relative al fatto che un dato sottoprogetto sia stato modificato
	 * @param sottoprogetto
	 * @return
	 */
	public ArrayList<ENotificaSottoprogettoAssegnato> getNotificheSottoprogettoModificato(ESottoprogetto sottoprogetto) {
		Criteria crit = session.createCriteria(ENotificaSottoprogettoModificato.class).add( Restrictions.eq("sottoprogetto", sottoprogetto));
		return (ArrayList) crit.list();	
	}
	
}
